/**
 * 日期工具函数
 */

/**
 * 格式化日期
 * @param date 日期对象、日期字符串或时间戳
 * @param format 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export function formatDate(
  date: Date | string | number,
  format: string = 'YYYY-MM-DD HH:mm:ss'
): string {
  if (!date) return '';

  let dateObj: Date;
  
  if (date instanceof Date) {
    dateObj = date;
  } else if (typeof date === 'string') {
    dateObj = new Date(date);
  } else if (typeof date === 'number') {
    dateObj = new Date(date);
  } else {
    return '';
  }

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    return '';
  }

  const year = dateObj.getFullYear();
  const month = String(dateObj.getMonth() + 1).padStart(2, '0');
  const day = String(dateObj.getDate()).padStart(2, '0');
  const hours = String(dateObj.getHours()).padStart(2, '0');
  const minutes = String(dateObj.getMinutes()).padStart(2, '0');
  const seconds = String(dateObj.getSeconds()).padStart(2, '0');

  return format
    .replace('YYYY', String(year))
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds);
}

/**
 * 格式化为相对时间
 * @param date 日期对象、日期字符串或时间戳
 * @returns 相对时间字符串，如 "2小时前"、"3天前"
 */
export function formatRelativeTime(date: Date | string | number): string {
  if (!date) return '';

  let dateObj: Date;
  
  if (date instanceof Date) {
    dateObj = date;
  } else if (typeof date === 'string') {
    dateObj = new Date(date);
  } else if (typeof date === 'number') {
    dateObj = new Date(date);
  } else {
    return '';
  }

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    return '';
  }

  const now = new Date();
  const diff = now.getTime() - dateObj.getTime();
  const seconds = Math.floor(diff / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);
  const months = Math.floor(days / 30);
  const years = Math.floor(days / 365);

  if (years > 0) {
    return `${years}年前`;
  } else if (months > 0) {
    return `${months}个月前`;
  } else if (days > 0) {
    return `${days}天前`;
  } else if (hours > 0) {
    return `${hours}小时前`;
  } else if (minutes > 0) {
    return `${minutes}分钟前`;
  } else if (seconds > 0) {
    return `${seconds}秒前`;
  } else {
    return '刚刚';
  }
}

/**
 * 判断是否为今天
 * @param date 日期对象、日期字符串或时间戳
 * @returns 是否为今天
 */
export function isToday(date: Date | string | number): boolean {
  if (!date) return false;

  let dateObj: Date;
  
  if (date instanceof Date) {
    dateObj = date;
  } else if (typeof date === 'string') {
    dateObj = new Date(date);
  } else if (typeof date === 'number') {
    dateObj = new Date(date);
  } else {
    return false;
  }

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    return false;
  }

  const today = new Date();
  return dateObj.toDateString() === today.toDateString();
}

/**
 * 获取日期范围的描述
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 日期范围描述
 */
export function getDateRangeDescription(
  startDate: Date | string | number,
  endDate: Date | string | number
): string {
  if (!startDate || !endDate) return '';

  const start = formatDate(startDate, 'YYYY-MM-DD');
  const end = formatDate(endDate, 'YYYY-MM-DD');

  if (start === end) {
    return start;
  }

  return `${start} 至 ${end}`;
}

/**
 * 格式化日期时间（包含时分秒）
 * @param date 日期对象、日期字符串或时间戳
 * @param format 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期时间字符串
 */
export function formatDateTime(
  date: Date | string | number,
  format: string = 'YYYY-MM-DD HH:mm:ss'
): string {
  return formatDate(date, format);
}

/**
 * 格式化时间（仅时分秒）
 * @param date 日期对象、日期字符串或时间戳
 * @param format 格式化模板，默认为 'HH:mm:ss'
 * @returns 格式化后的时间字符串
 */
export function formatTime(
  date: Date | string | number,
  format: string = 'HH:mm:ss'
): string {
  return formatDate(date, format);
}

/**
 * 将日期转换为ISO格式
 * @param date 日期对象、日期字符串或时间戳
 * @returns ISO格式的日期字符串
 */
export function toISOFormat(
  date: Date | string | number
): string | null {
  if (!date) return null;

  let dateObj: Date;
  if (date instanceof Date) {
    dateObj = date;
  } else if (typeof date === 'string') {
    // 处理不同格式的日期字符串
    const dateStr = date.replace(/\s+/, 'T'); // 替换空格为T
    dateObj = new Date(dateStr);
  } else if (typeof date === 'number') {
    dateObj = new Date(date);
  } else {
    return null;
  }

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    return null;
  }

  return dateObj.toISOString();
}